// https://www.programmercarl.com/0209.%E9%95%BF%E5%BA%A6%E6%9C%80%E5%B0%8F%E7%9A%84%E5%AD%90%E6%95%B0%E7%BB%84.html#%E7%AE%97%E6%B3%95%E5%85%AC%E5%BC%80%E8%AF%BE
// https://leetcode.cn/problems/minimum-size-subarray-sum/description/

// 滑动窗口
// 接下来就开始介绍数组操作中另一个重要的方法：滑动窗口。

// 所谓滑动窗口，就是不断的调节子序列的起始位置和终止位置，从而得出我们要想的结果。

// 在暴力解法中，是一个for循环滑动窗口的起始位置，一个for循环为滑动窗口的终止位置，用两个for循环 完成了一个不断搜索区间的过程。

// 那么滑动窗口如何用一个for循环来完成这个操作呢。

// 首先要思考 如果用一个for循环，那么应该表示 滑动窗口的起始位置，还是终止位置。

// 如果只用一个for循环来表示 滑动窗口的起始位置，那么如何遍历剩下的终止位置？

// 此时难免再次陷入 暴力解法的怪圈。

// 所以 只用一个for循环，那么这个循环的索引，一定是表示 滑动窗口的终止位置。

// 那么问题来了， 滑动窗口的起始位置如何移动呢？

// 这里还是以题目中的示例来举例，s=7， 数组是 2，3，1，2，4，3，来看一下查找的过程：
const minSubArrayLen = function (target, nums) {
  let slow = 0,
    fast = 0;
  let sum = 0;
  let res = Infinity;

  while (fast < nums.length) {
    sum += nums[fast];
    fast++;
    while (sum >= target) {
      res = Math.min(res, fast - slow);
      sum -= nums[slow];
      slow++;
    }
  }
  return res === Infinity ? (res = 0) : res;
};



// const target = 7, nums = [2,3,1,2,4,3]
// const target = 4, nums = [1,4,4]
const target = 15,
  nums = [1, 2, 3, 4, 5];
console.log(minSubArrayLen(target, nums));
